home *** CD-ROM | disk | FTP | other *** search
-
- {
-
- I've been puzzling over Share myself the last week. Here's some
- tips from what I've found:
-
- 1. Remember, if you are trying to write to the same region from
- both processes, you will *still* get a sharing violation with
- access denied to the last one to ask ! There is a subfunc, (440Bh
- I think) for changing the default number of tries that share will
- retry for access. You might want to look into that. Otherwise you
- could use something like the OpenTxtFile routine below, modified
- for use on non-text files, or both. (You aren't trying to share
- text files are you? If so, there IS a way to do it, let me know).
-
- 2. Also note that you set the filemode AFTER assignment, and
- BEFORE a reset, rewrite or append.
-
- 3. The following are 2 functions I've put together to handle my
- stuff. Note that the first is for non-text files, the second is
- for text files. The text file routine uses an external TFDD unit
- to set up the filemode variable so it works with text files.
- Holler if you want the unit also.........
-
- (* Call this to lock or unlock the ENTIRE file
- ****** use lock =$00 & unlock = $01 constants for action *********
- ***** SHARE.EXE MUST be loaded ! *******
- Do NOT use on Text Files ! will NOT work !
- You could modify this to only lock certain regions by passing values
- for a start and stop region. Load CX/DX and DI/SI as done below. *)
- }
-
- Function LockFile(var f; action:byte):boolean;
- Var
- fsize : longint;
- Begin
- if GotShare then (* Share loaded ? *)
- begin
- fsize := longint(filesize(file(f))); (* Get filesize *)
- Regs.AH := $5C; (* Subfunc *)
- Regs.AL := Action; (* $00=Lock or $01=unlock *)
- Regs.BX := FileRec(f).Handle; (* Git the handle *)
- Regs.CX := Hi($00); (* Start of file *)
- Regs.DX := Lo($00);
- Regs.DI := Lo(fsize); (* Compute end of file *)
- Regs.SI := Hi(fsize);
- Intr($21, Regs);
- if ((Regs.FLAGS and $01) = 0) then LockFile := true
- else
- begin
- IORes := regs.AX; (* If fails, errcode is in AX *)
- LockFile := false; (* IORes is a global that gets *)
- end; (* used in IOReport if an error *)
- end;
- End;
-
- (*-------------------------------------------------------------*)
- (* Share compatable Will retry if access denied, tries times
- 5 Tries is equivilent to a 1/2 second wait
-
- ----- Sharing Method -----
- Access Compatibility Deny Deny Deny Deny
- Method Mode Both Write Read None
- ---------------------------------------------------------
- Read Only 0 16 32 48 64
- Write Only 1 17 33 49 65
- Read/Write 2* 18 34 50 66
- * = default *)
-
- FUNCTION OpenTxtFile(var f; fname:string; tries:word):boolean;
- VAR
- i : word;
- Begin
- i := 0;
- if GotShare then (* Share loaded ? *)
- begin
- AssignText(text(f),Fname); (* From TxtShare unit *)
- FileMode := 34; (* Open in r/w-deny write mode *)
- end
- else Assign(text(f),Fname);
- Repeat
- {$I-} Reset(text(f));
- IORes := IoResult; {$I+}
- if IORes = 5 then (* Only repeat if denied access *)
- begin
- wait(100); (* Wait 1/10 second before retry *)
- INC(i); (* Use your own delay routine here *)
- end
- else i := tries; (* Quit if not a sharing deny *)
- Until (IORes = 0) OR (i >= tries);
- if GotShare then FileMode := 2; (* Set FileMode to default *)
- OpenTxtFile := IORes = 0;
- End;
-
- { ****** Here's a quick SHARE detect routine ********* }
-
- Function ShareInstalled : boolean; assembler;
- asm
- mov ax,$1000
- int $2f
- end;
-